/**
 * \file Principal.cpp
 * \brief Fichier test pour le dictionnaire
 * \author �tudiant 1, �tudiant 2
 * \version 0.1
 * \date juillet 2014
 *
 */

#include <iostream>
#include <fstream>
#include <string>
#include <ctype.h>
#include "Dictionnaire.h"


using namespace std;
using namespace TP2P1;






int main()
{
	//ouvrir un fichier dictionnaire spécifié par l'utilisateur
	bool fichierOuvert=false;
	do
	{
		cout<<"Entrez le nom du fichier du dictionnaire Anglais-Français : "<<endl;
		string nomFichierString;
		getline (cin, nomFichierString);
		ifstream fichierDictionnaire (nomFichierString.c_str(), ios::in);
		if(!fichierDictionnaire.is_open())
		{
			cout<<"Erreur lors de l'ouverture du fichier."<<endl;
		}
		else
		{
			fichierOuvert = true;
			try
			{
				Dictionnaire dicto(fichierDictionnaire);		//le dictionnaire
				vector<string> traduction;						//le vecteur qui contiendra les mots traduits
				bool continueExecution = true;
				do
				{
					try
					{
						//demander une phrase en anglais
						cout<<"Entrez un texte en anglais : ";
						string phraseEnAnglais;
						getline (cin, phraseEnAnglais);

						//mettre en lowercase
						for (unsigned int i = 0; i < phraseEnAnglais.size(); i++)
						{
							phraseEnAnglais.at(i) = tolower(phraseEnAnglais.at(i));
						}

						//séparer la phrase en un vecteur de mots individuel
						vector<string> motsATraduire;
						vector<char> caracteresDunMot;
						for (unsigned int i = 0; i < phraseEnAnglais.size() ; i++)
						{

							//si on trouve un espace ou la fin de l'entrée, ca veut dire qu'on est à la fin d'un mot
							if (phraseEnAnglais.at(i) == ' ')
							{
								//vérifier qu'il y a quelque-chose à traiter dans le vecteur caracteresDunMot;
								if(caracteresDunMot.empty()) continue;
								//***traitement pour prendre caracteresDunMot et créer un mot dans motsATraduire
								//créer un string des caractères précédents
								string nouveauMot(caracteresDunMot.begin(),caracteresDunMot.end());
								//effacer le contenu du vecteur de char
								caracteresDunMot.erase(caracteresDunMot.begin(), caracteresDunMot.end());
								//ajouter le nouveau mot au vecteur de mots à traduire
								motsATraduire.push_back(nouveauMot);
							}
							else
							{
								//traitement pour ajouter la lettre à caracteresDunMot
								caracteresDunMot.push_back(phraseEnAnglais.at(i));
							}
							if (i == phraseEnAnglais.size()-1)  //dernière itération seulement
							{
								string nouveauMot (caracteresDunMot.begin(), caracteresDunMot.end());
								caracteresDunMot.erase(caracteresDunMot.begin(), caracteresDunMot.end());
								motsATraduire.push_back(nouveauMot);
							}
						}
						//vérifier pour chaque mot si le mot est dans le dictionnaire
						for (vector<string>::iterator itMots = motsATraduire.begin(); itMots!=motsATraduire.end(); itMots++)
						{

							if (!dicto.appartient(*itMots))
							{
								cout<<"Mot introuvable : "<<*itMots<<endl;
								//si le mot est introuvable, chercheSuggestions
								vector<string> suggestions (dicto.suggereCorrections(*itMots));
								//demande a l'usager de choisir une suggestion
								cout<<"Veuillez choisir un mot parmis les mots suivants : "<<endl;
								int compteur = 1;
								for (vector<string>::iterator itSugg = suggestions.begin(); itSugg!=suggestions.end(); itSugg++)
								{
									//afficher les options
									cout<<compteur<<". "<<*itSugg<<endl;
									compteur++;
								}

								//demander à l'usager de choisir une option (1-10)
								cout<<"Votre choix: ";
								unsigned int choix=0;
								cin>>choix;
								cin.ignore();
								while (choix > suggestions.size() || choix <= 0)
								{
									cout<<"SVP entrez un choix valide."<<endl;
									cout<<"Votre choix: ";
									cin>>choix;
									cin.ignore();
								}

								//on remplace le mot à traduire original par le mot choisi
								*itMots = suggestions[choix-1];
							}


							//est-ce qu'il existe une traduction pour le mot anglais?
							vector<string> traductionsPossibles = dicto.traduit(*itMots);
							if (!traductionsPossibles.empty())
							{
								//si oui
								//est-ce qu'il y en a plus qu'une?
								if(traductionsPossibles.size()!=1)
								{
									//si oui, choisir la bonne
									cout<<"Plusieurs traductions sont possibles pour le mot "<<*itMots<<
											". Veuillez en choisir une parmi les suivantes : "<<endl;
									//afficher les options
									int itTradCompteur=1;
									for (vector<string>::iterator itTraductionsPossibles = traductionsPossibles.begin();
											itTraductionsPossibles != traductionsPossibles.end(); itTraductionsPossibles++)
									{
										cout<<itTradCompteur<<". "<<*itTraductionsPossibles<<endl;
										itTradCompteur++;
									}
									unsigned int choixTraductionsPossibles = 0;
									cin>>choixTraductionsPossibles;
									cin.ignore();
									while(choixTraductionsPossibles > traductionsPossibles.size() || choixTraductionsPossibles < 0 )
									{
										cout<<"Choix invalide. SVP choisir un élément valide."<<endl;
										cin>>choixTraductionsPossibles;
										cin.ignore();
									}
									traduction.push_back(traductionsPossibles[choixTraductionsPossibles-1]);


								}
								else
								{
									//si non, utiliser celle par défaut
									traduction.push_back(traductionsPossibles[0]);
								}

							}
							else
							{
								//sinon on avertit l'usager et on garde le mot original
								cout<<"Aucune traduction trouvée pour "<<*itMots<<". Nous conserverons le mot original."<<endl;
								traduction.push_back(*itMots);
							}

						}
						//et on montre le texte au complet en francais
						cout<<"Voici le texte traduit en français: ";
						for (vector<string>::iterator itTraductions = traduction.begin(); itTraductions != traduction.end(); itTraductions++)
						{
							cout<<*itTraductions<<" ";
						}
						cout<<"."<<endl;
						traduction.clear();


					}
					//FAIRE DES "CATCH" plus spécifiques içi.
					catch (logic_error& le)
					{
						cout<<le.what()<<endl;
						continueExecution=false;
						fichierOuvert=false;
					}
					catch (...)  	//s'il y a d'autres erreurs inattendues.
					{
						cout<<"Une erreur s'est produite. SVP essayez de nouveau."<<endl;
						continueExecution=false;
						fichierOuvert=false;
					}
					cout<<"Désirez-vous continuer?"<<endl;
					cout<<"Pour quitter, entrer \"non\".  Pour continuer, appuyez sur Retour ou entrer n'importe quel autre caractère."<<endl;
					string veutContinuer;
					getline(cin, veutContinuer);
					if(veutContinuer=="non")
					{
						continueExecution = false;
					}

				}
				while (continueExecution == true);
			}
			catch (bad_alloc& ba_erreur)
			{
				cout<<"Erreur d'allocation de mémoire."<<endl;
			}
		}
	}
	while (fichierOuvert == false);
    return 0;
}
